#include <memlayout.h>

# vectors.S sends all traps here.
# 定义了一个全局标签 __alltraps，这是处理所有异常的入口点。
.text
.globl __alltraps
__alltraps:
    # push registers to build a trap frame
    # therefore make the stack look like a struct trapframe
    # 通过 push 指令，将数据段寄存器和所有通用寄存器（使用 pushal）的值压入栈中，以保存当前状态。
    pushl %ds
    pushl %es
    pushl %fs
    pushl %gs
    pushal

    # load GD_KDATA into %ds and %es to set up data segments for kernel
    # 将常量 GD_KDATA 加载到 %eax 中，然后将其值复制到 %ds 和 %es 中，设置内核的数据段。
    movl $GD_KDATA, %eax
    movw %ax, %ds
    movw %ax, %es

    # push %esp to pass a pointer to the trapframe as an argument to trap()
    # 将 %esp 压栈，以将指向 trapframe 的指针作为参数传递给 trap()
    pushl %esp

    # call trap(tf), where tf=%esp
    # 调用 trap(tf)，其中 tf=%esp
    call trap

    # pop the pushed stack pointer弹出之前压入的栈指针
    popl %esp

    # return falls through to trapret...
    # 返回后继续执行到 trapret...
.globl __trapret
__trapret:
    # restore registers from stack
    # 定义了返回的入口点 __trapret。
    popal

    # restore %ds, %es, %fs and %gs
    # 这里会恢复之前保存的寄存器
    popl %gs
    popl %fs
    popl %es
    popl %ds

    # get rid of the trap number and error code
    # 通过 iret 指令返回中断处理
    addl $0x8, %esp
    iret

